\chapter{はじめに}
PPPはリンク層とネットワーク層の接続と通信、切断を担当する
プロトコルです。そのため、通常PPPはカーネルの中に実装されますが、
ここで説明するPPPはカーネルの中ではなく、ユーザ・プロセスとして
実装されています。実際にはPPPはIPからの送出要求を検出したり、
受信したデータをIPに引き渡すというように、IPとのインターフェイスを
必要とします。IPに直接アクセスすることは、ユーザ・プロセスからは
できません。そこで、本実装ではトンネル・ドライバを利用することにより
IP層とのインターフェイスを可能としています。

本PPPは、ユーザが自宅から会社あるいは学校のネットワークをアクセスする
ために使用することを想定し、クライアントとして動作することに重点を
おいています。

\paragraph{特徴}
\begin{itemize}
\item Kermitライクなユーザインタフェイスを提供し、対話的に
  PPPを利用することができます。相手側システムとの接続は、
  手動/自動のどちらでも可能です。コマンドを用いて対話的に
  接続の確立/切断ができるだけでなく、プロトコルの動作状況を
  知ることもできます。
\item 対話的に動作する対話モードの他にも、
  デーモンとして動作する自動モード、直接ttyと入出力をする
  直接モード、専用線接続に対応した専用線モードが
  用意されています。
\item BSDI-1.1, FreeBSD-1.1で動作するので、自宅からのダイアルアップIP
  接続に利用できます。
  パケットの流れを記録するログ機能が用意されていますので、相手側PPPとの
  パケットのやりとりの様子をモニタすることが可能です。
  トンネルドライバは、bpfに対応していますので、tcpdumpによる
  モニタリングもできます。
\item 自動モードで動作させることによりOn-demand dialup機能が
  利用できますので、パケットを検出して自動的にダイアリングする
  ことが可能です。また、idle timer機能により
  パケットの流れが無くなると自動的に回線を切断することができます。
\item 自動モードあるいは直接モードとして動作している場合にも、
  telnetを利用して対話的な操作が可能です。
\item RFC1331, RFC1332に準拠しています。また、LQR(RFC1333)
  PAP/CHAP(RFC1334)機能も有しています。
\item Predictor Type-1によるパケットデータの圧縮機能をサポートしています。
\item パケットの送受信を禁止/許可するためのフィルタリング機能が
  用意されています。また、On-demandでのダイアリングのトリガとなる
  パケットの制限もフィルタによって指定することができます。
\item PPPのプロトコル自体はユーザ・プロセスとして動作します。
  そのため、バグなどにより異常が発生してもプロセスがコアを吐いて死ぬだけで、
  システムがパニックを起こす危険を最小限にとどめることができます。
\end{itemize}

\chapter{インストール}
インストールの作業は、トンネルデバイスとPPPプログラムのインストールの
2つの部分からなります。あなたが使用するシステムにトンネルデバイスが
インストールされていない場合には(まぁ、普通はそうでしょうが)、カーネルに
デバイスドライバを組み込む必要があります。

\section{トンネルデバイスのインストール}
トンネルデバイスは、IP層とのインターフェイスをキャラクタデバイスの形態
で提供する特殊デバイスです。PPPはこのトンネルデバイスを用いて動作する
ように設計されていますので、PPPの利用に先立ってカーネルにトンネルデバイスを
組み込んでおく必要があります。

\subsection{インストール手順}
現在、ドライバはBSDI(BSD/386)1.1およびFreeBSD-1.1に
対応しています。
Driversのディレクトリには、それぞれのシステム用のドライバが
用意されていますので、それを使ってカーネルを再構築します。
以下の説明ではBSDIの場合を中心に説明します。
%FreeBSDではディレクトリの場所などが異なっていますので注意してください。

%また、NetBSDには標準的にトンネルデバイスのドライバが付属していますが、
%ここで使用するものは、それを若干修正したものとなっています。

\begin{enumerate}
\item {\em if\_tun.c\/}と{\em if\_tun.h\/}を {\em /sys/net\/}にコピーします。
  {\em if\_tun.h\/}は {\em /usr/include/net\/}にもコピーしてください。
  \begin{screen}\baselineskip12pt
    \begin{verbatim}
# cp if_tun.c if_tun.h /sys/net
# cp if_tun.h /usr/include/net
    \end{verbatim}
  \end{screen}
\item BSDIの場合には、{\em /sys/kern/subr\_pdev.c\/}を編集し、
  以下の行を追加します。
  FreeBSDでは、仮想ドライバのアタッチは
  リンク時に生成されたテーブルを参照して行われるようになっている
  ためこの修正は必要ありません。
  \begin{screen}\baselineskip12pt
    \begin{verbatim}
#ifdef TUN
#include "tun.h"
#if NTUN > 0
        tunattach();                    /* XXX */
#endif
#endif
    \end{verbatim}
  \end{screen}
\item BSDIでは、{\em files}を{\em /sys/conf/files\/}にコピーする。
\item conf.c.patchを参考に、システムに応じて{\em /sys/i386/i386/conf.c\/}を
  修正する。すでにドライバを追加している場合には、既存のデバイスの番号が
  変わらないように、追加エントリを\verb|cdevsw[]|の最後に追加するように
  してください。
\item {\em /sys/i386/conf\/}へ移動し、configファイルを編集し、以下の行を
  追加する。
  \begin{verbatim}
options TUN
...
pseudo-device tun 2
  \end{verbatim}
\item カーネルをconfig, makeする。
  \begin{screen}\baselineskip12pt
    \begin{verbatim}
# config XXX
# cd /sys/compile/XXX
# make depend; make
    \end{verbatim}
  \end{screen}
\item 新しいカーネルをインストールしてリブートする。
\item トンネルデバイスのデバイスファイルを作成する。Major numberは、
  {\em conf.c\/}で tun deviceに割り当てられたものを使用してください。
  \begin{screen}\baselineskip12pt
    \begin{verbatim}
# cd /dev
# mknod tun0 c 29 0
# mknod tun1 c 29 1
    \end{verbatim}
  \end{screen}
\end{enumerate}

\subsection{トンネルデバイスの動作試験}
トンネルドライバの試験のために、ICMP echo serverの機能をもつ
簡単なプログラム{\em tunecho.c\/}を用意しました。デバイスとioctlの
使い方は、このプログラムを読んでもらえばわかると思います。

動作試験手順は次のとおりです。試験に際しては、windowを2つ
開いておいてください。

\begin{enumerate}
\item tunecho を {\it make\/} する。
  \begin{screen}\baselineskip12pt
    \begin{verbatim}
        % make
    \end{verbatim}
  \end{screen}
\item Winodw 1 で tunecho を root で実行する。引数なし。
  リターンを押すとプログラムは終了します。
  \begin{screen}\baselineskip12pt
    \begin{verbatim}
        # ./tunecho
    \end{verbatim}
  \end{screen}
\item Window 2 で {\it netstat --i\/} を取ると、tun0 が見えます。
  ifconfig tun0 してみてください。
  \begin{screen}\baselineskip12pt
    \begin{verbatim}
        % /sbin/ifconfig tun0
        tun0: flags=50<POINTOPOINT,RUNNING>
                inet 100.123.111.2 --> 100.123.111.8 netmask ffffffff 
        %
    \end{verbatim}
  \end{screen}

\item 100.123.111.8 に {\it ping\/} してみれば返答が返ってきます。
  Window 1で動いている {\it tunecho\/} を止めれば tun0 はダウンして
  echo は返ってこなくなります。
\end{enumerate}

\section{PPPのインストール}
本PPPのインストールは、いたって簡単です。まず、最初に{\em defs.h\/}を
確認してモデムを接続するデバイスのデバイス名と接続速度を確認して、
必要であれば変更してください。

{\em defs.h\/}の変更ができたら、{\em make\/}をしたのち適切なディレクトリに
インストールします。なお、インストールの際にはあらかじめ{\em ppp.conf\/}を
自分の利用する環境にあわせて編集しておいてください。

\begin{screen}\baselineskip12pt
  \begin{verbatim}
  % make depend; make
  # su
  # make install
  \end{verbatim}
\end{screen}

\subsection{モデムの設定}
本PPPを使用するに際しては、モデムを以下のように設定してご利用ください。

\begin{itemize}
\item フロー制御にはRTS/CTSを使用する。PPPプログラムは動作を
  開始すると強制的にRTS/CTSフロー制御を使います。
\item キャリアの検出によりDCDが上がり、キャリアがなくなると
  DCDが落ちるように設定する。
\item DTRがonからoffになったことを検出し、回線の接続を切断する。
  プログラムを強制的に終了させた場合に、接続が切れるように
  するために必要です。
\item PCとモデムの間は、CPUやI/Oカードの性能に応じてできるだけ
  速い速度で接続する。16550を使っていれば、少なくとも38,400bpsで
  接続できるはずです。
\end{itemize}

% Local Variables: 
% mode: japanese-LaTeX
% TeX-master: "guide"
% End: 
